package com.example.service;
import com.example.dao.BookDao;
import com.example.mapper.BookInfoMapper;
import com.example.model.BookInfo;
import com.example.model.PageRequest;
import com.example.model.PageResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
/**
 * 图书业务逻辑层
 * 职责：处理图书相关的业务逻辑
 * 业务逻辑层是系统的核心，负责处理复杂的业务规则
 */
@Slf4j
@Service
public class BookService {

    @Autowired
    private BookInfoMapper bookInfoMapper;

    /**
     * 获取图书列表业务方法
     * 该方法包含业务逻辑：将状态码转换为中文说明
     * @return 处理后的图书列表，包含状态中文说明
     */
    public List<BookInfo> getBookList() {
        // 创建数据访问层对象
        // 数据访问层负责与数据源交互，这里获取原始数据
        BookDao bookDao = new BookDao();

        // 调用数据访问层获取原始数据
        // 数据访问层返回的是从数据库或模拟数据源获取的原始数据
        List<BookInfo> books = bookDao.mockData();

        // 业务逻辑处理：设置状态中文说明
        // 这是典型的业务规则处理，将数字状态码转换为用户可读的中文说明
        for (BookInfo book : books) {
            // 遍历每本图书，根据状态码设置对应的中文说明
            if (book.getStatus() == 1) {
                // 状态为1表示图书可借阅
                book.setStatusCN("可借阅");  // 业务规则：状态1对应"可借阅"
            } else {
                // 其他状态表示图书不可借阅
                book.setStatusCN("不可借阅"); // 业务规则：其他状态对应"不可借阅"
            }
        }

        // 返回业务处理后的数据
        // 此时数据已经过业务逻辑处理，包含了用户友好的状态说明
        return books;
    }

    /**
     * 添加图书
     * @param bookInfo 图书信息
     */
    public void addBook(BookInfo bookInfo) {
        bookInfoMapper.insertBook(bookInfo);  // 调用数据访问层插入数据
    }



    /**
     * 分页查询图书列表
     * @param pageRequest 分页参数
     * @return 分页结果
     */
    public PageResult<BookInfo> getBookListByPage(PageRequest pageRequest) {
        // 查询总记录数 - 用于计算总页数
        Integer count = bookInfoMapper.count();
        // 分页查询图书列表 - 获取当前页数据
        List<BookInfo> books = bookInfoMapper.queryBookListByPage(pageRequest);

        // 设置状态中文描述（使用枚举）
        for (BookInfo book : books) {
            // 通过状态码获取枚举实例，再获取对应的中文名称
            book.setStatusCN(com.example.enums.BookStatus.getNameByCode(book.getStatus()).getName());
        }

        // 返回分页结果，包含总记录数、分页参数和当前页数据
        return new PageResult<>(count, pageRequest, books);
    }

    public BookInfo queryBookById(Integer bookId) {
        return bookInfoMapper.queryBookById(bookId);  // 直接调用数据层查询
    }

    public void updateBook(BookInfo bookInfo) {
        bookInfoMapper.updateBook(bookInfo);  // 直接调用数据层更新
    }


    /**
     * 删除图书业务方法
     * @param bookId 图书ID
     * @return 受影响的行数
     */
    public Integer deleteBook(Integer bookId) {
        BookInfo bookInfo = new BookInfo();  // 创建图书信息对象
        bookInfo.setId(bookId);  // 设置要删除的图书ID
        bookInfo.setStatus(0);  // 设置状态为0，表示逻辑删除
        return bookInfoMapper.updateBook(bookInfo);  // 调用Mapper更新方法
    }

    /**
     * 批量删除图书
     * @param ids 图书ID列表
     */
    public void batchDeleteBook(List<Integer> ids) {
        if (ids == null || ids.isEmpty()) {  // 校验ID列表是否为空
            return;  // 如果为空则直接返回
        }
        bookInfoMapper.batchDeleteBook(ids);  // 调用Mapper批量删除方法
    }
}